[毎日Kotlin] Day6.Strings(テンプレート)
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
テンプレートを使って正規表現を書いてみよう!
Read about different string literals and string templates in Kotlin.
Raw strings are useful for writing regex patterns, you don't need to escape a backslash by a backslash. Below there is a pattern that matches a date in format 13.06.1992 (two digits, a dot, two digits, a dot, four digits):
fun getPattern() = """\d{2}\.\d{2}\.\d{4}"""
Using month variable rewrite this pattern in such a way that it matches the date in format 13 JUN 1992 (two digits, a whitespace, a month abbreviation, a whitespace, four digits).
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)" fun getPattern(): String = TODO()
狙い
ここで考えて欲しい問題の意図はなんだろうか?
Javaになかったテンプレート機能が追加されました。文字列の結合や変数をいれるときにいちいち+で結合やStringBuilderなど使う必要がなくなったのです。便利。便利すぎる!
とにかく、テンプレートを体感せよ
正規表現の"""でくくるやり方もテンプレート機能です。テンプレート使わない方法もやってみよう。
解答例
fun getPattern(): String = """\d{2} $month \d{4}"""
テンプレートを使わない例
fun getPattern(): String = "\\d{2} ${month} \\d{4}"
\をエスケープしないといけないので、正規表現だけを書くことができません。面倒です。
Javaの例
同じようなことをすると、+で結合や\をエスケープする必要があります。
public class Main { private static final String month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"; public static String getPattern() { return "\\d{2} " + month + " \\d{4}"; } public static void main(String[] args) { System.out.println("11 MAR 1952".matches(getPattern())); System.out.println("24 AUG 1957".matches(getPattern())); System.out.println("24 RRR 1957".matches(getPattern())); } }
あとがき
今回は正規表現の例でテンプレートを使用しましたが、単純に文字列結合のテンプレートもあります。
val name = "kamedon" print("Hello $name! ")
+で結合しないといけなかったのが、$変数名で同じことができるのですごい楽になりました。
どんどんテンプレート使っていこう!
Day7.でまたお会いしましょう。